package com.lg.algorithm.collections.queue.block;

import lombok.SneakyThrows;

import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 开始多大
 * 默认是11 。可以指定大小，指定多大就是多大，指定完大小会也可以扩容。容量最大为 Integer.MAX_VALUE - 8
 *
 * 是否可以扩容，最大有限制么？
 * 可以，容量最大为 Integer.MAX_VALUE - 8
 * 数组满了之后，再向里面添加数据
 *
 *
 * 增加的时候会被阻塞
 * 满的时候，会扩容
 *
 * 往外拿的时候也会被阻塞
 * 空的时候会阻塞
 *
 * 底层数据结构是什么
 * 数组 堆
 * 构建队列的时候可以传入compare，也可以重写对象的compare。默认使用对象的compare。
 * 默认是小顶堆，要大顶堆可以重写 他的compare。
 *
 * 阻塞线程会被挂起么
 * 会，只有队列是空的时候，并再次向里面拿东西的时候，会被阻塞。 LockSupport.park(this)
 *
 * 阻塞会释放锁资源么
 * 会，只有队列是空的时候，并再次向里面拿东西的时候，会被阻塞。 LockSupport.park(this)
 */
public class PriorityBlockingQueueTest {
    @SneakyThrows
    public static void main(String[] args) {
        PriorityBlockingQueue priorityBlockingQueue = new PriorityBlockingQueue();
        PriorityBlockingQueue<Integer> integers1 = new PriorityBlockingQueue<>(1);

        priorityBlockingQueue.put(8);
        priorityBlockingQueue.put(3);
        priorityBlockingQueue.put(2);
        priorityBlockingQueue.put(7);
        System.out.println(priorityBlockingQueue.poll());
        System.out.println(priorityBlockingQueue.poll());
        System.out.println(priorityBlockingQueue.poll());
        System.out.println(priorityBlockingQueue.poll());

        /**
         * 失败抛出异常
         *      add  remove element
         *          element 看一看但不拿出来
         */
        System.out.println("======抛出异常======");
        boolean add1 = integers1.add(1);
        boolean add11 = integers1.add(1);
        System.out.println(integers1.element());
        System.out.println(integers1.size());
        integers1.remove(1);
        System.out.println(integers1.size());

        /**
         *  特殊返回
         *      offer   poll    peek
         */
        System.out.println("======特殊返回======");
        integers1.offer(1);
        integers1.peek();
        integers1.poll();

        System.out.println("======超时返回======");
        integers1.offer(1, 1, TimeUnit.SECONDS);
        integers1.poll(1, TimeUnit.SECONDS);

        System.out.println("======阻塞======");
        integers1.put(1);
//        System.out.println(integers1.size());
        integers1.put(3);
//        System.out.println(integers1.size());
        integers1.put(0);
        System.out.println(integers1.take());

    }
}
